package ar.edu.utn.frba.dds.opendesigners.ui.arena;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.aop.windows.TransactionalDialog;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.commons.utils.Observable;


import ar.edu.utn.frba.dds.opendesigners.dominio.BusquedasModel;
import ar.edu.utn.frba.dds.opendesigners.dominio.TipoAsientoTransformer;
import ar.edu.utn.frba.dds.opendesigners.dominio.UbicacionAsientoTransformer;
import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionAsientoReservado;
import ar.edu.utn.frba.dds.opendesigners.resultados.AsientoGridItem;
import ar.edu.utn.frba.dds.opendesigners.user.Usuario;

@SuppressWarnings("serial")
@Observable
public class BusquedasWindow extends TransactionalDialog<BusquedasModel>{
	public BusquedasWindow(WindowOwner parent, Usuario usuario) {
		super(parent, new BusquedasModel(usuario));
		this.setTitle("Aterrizar.com");
	}
	

	@Override
	protected void createFormPanel(Panel mainPanel) {
		//Creo un panel que va a contener la bienvenida a los usuarios, haciendo
		//visible los datos del usuario logueado
		Panel datosBusquedaPanel = new Panel(mainPanel);
		datosBusquedaPanel.setLayout(new ColumnLayout(6));
		
		new Label(datosBusquedaPanel).setText("Origen");
		new TextBox(datosBusquedaPanel).bindValueToProperty("origen");

		new Label(datosBusquedaPanel).setText("Destino");
		new TextBox(datosBusquedaPanel).bindValueToProperty("destino");
		
		new Label(datosBusquedaPanel).setText("Fecha");
		new TextBox(datosBusquedaPanel).bindValueToProperty("fecha");
		
		Panel botonBusquedaPanel = new Panel(mainPanel);
		
		new Button(botonBusquedaPanel)//
		.setCaption("Buscar")
		.onClick(new MessageSend(this.getModelObject(), "buscar"));

		this.createResultsGrid(mainPanel);
		
	}
	
	protected void createResultsGrid(Panel mainPanel) {
		Table<AsientoGridItem> table = new Table<AsientoGridItem>(mainPanel, AsientoGridItem.class);
		table.setHeigth(200);
		table.setWidth(450);

		table.bindItemsToProperty("resultados");
		table.bindValueToProperty("asientoSeleccionado");

		this.describeResultsGrid(table);
	}

	protected void describeResultsGrid(Table<AsientoGridItem> table) {
		new Column<AsientoGridItem>(table) //
			.setTitle("Aerolinea")
			.setFixedSize(80)
			.bindContentsToProperty("nombreAerolinea");

		new Column<AsientoGridItem>(table) //
			.setTitle("Vuelo")
			.setFixedSize(120)
			.bindContentsToProperty("numeroVuelo");
	
		new Column<AsientoGridItem>(table) //
			.setTitle("Asiento")
			.setFixedSize(60)
			.bindContentsToProperty("numeroAsiento");
		
		new Column<AsientoGridItem>(table) //
			.setTitle("Precio")
			.setFixedSize(65)
			.bindContentsToProperty("precio");
		
		new Column<AsientoGridItem>(table) //
			.setTitle("Ubicacion")
			.setFixedSize(70)
			.bindContentsToTransformer(new UbicacionAsientoTransformer());
		
		new Column<AsientoGridItem>(table) //
			.setTitle("Clase")
			.setFixedSize(70)
			.bindContentsToTransformer(new TipoAsientoTransformer());

	}
	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle("Aterrizar.com");
		this.setTaskDescription("Seleccione la operación a realizar");
		super.createMainTemplate(mainPanel);
		
	}
	
	@Override
	protected void addActions(Panel actionsPanel) {
		//
		Button btnComprar = new Button(actionsPanel).setCaption("Comprar")//
		.onClick(new MessageSend(this, "comprar"));
		
		Button btnReservar = new Button(actionsPanel).setCaption("Reservar")//
		.onClick(new MessageSend(this, "reservar"));
		
		new Button(actionsPanel).setCaption("Cerrar")//
		.onClick(new MessageSend(this, "cancel"));
		
		// Deshabilitar los botones si no hay ningún elemento seleccionado en la grilla.
		NotNullObservable elementSelected = new NotNullObservable("asientoSeleccionado");
		btnComprar.bindEnabled(elementSelected);
		btnReservar.bindEnabled(elementSelected);
	}
	
	// ********************************************************
	// ** Acciones
	// ********************************************************

	//Agrego para que las ventanitas despues puedan seguir buscando
	public void buscar(){
		this.getModelObject().setAsientoSeleccionado(null);
		MessageSend sendmsg = new MessageSend(this.getModelObject(), "buscar");
		sendmsg.execute();
	}
	
	public void comprar() {
		MessageSend sendmsg = new MessageSend(this.getModelObject(), "comprar");
		sendmsg.execute();
		
		ResultadoOperacionWindow oWindow = new ResultadoOperacionWindow(this, this.getModelObject().getAsientoSeleccionado());
		configurarVentana(oWindow,'C');
		oWindow.open();
			
	}

	public void sobrereservar(){
		MessageSend sendmsg = new MessageSend(this.getModelObject(), "sobrereservar");
		sendmsg.execute();
		
		MessageSend sendmsg2 = new MessageSend(this.getModelObject(), "buscar");
		sendmsg2.execute();
	}
	
	public void reservar() {
		try{
			//Primero intenta reservar..
			MessageSend sendmsg = new MessageSend(this.getModelObject(), "reservar");
			sendmsg.execute();
			
			ResultadoOperacionWindow oWindow = new ResultadoOperacionWindow(this, this.getModelObject().getAsientoSeleccionado());
			configurarVentana(oWindow,'R');
			oWindow.open();
		}
		catch(ExcepcionAsientoReservado ex){
			//Si no puede consulto si quiere sobrereservar. Si me dice que si, sigo.
			ResultadoOperacionConsultaSRWindow oWindow = new ResultadoOperacionConsultaSRWindow(this, this.getModelObject().getAsientoSeleccionado());
			oWindow.setTaskDescription("El asiento " + this.getModelObject().getAsientoSeleccionado().getNumeroAsiento() + " ya se encuentra reservado. ¿Que desea hacer?");
			oWindow.onAccept(new MessageSend(this, "sobrereservar"));
			oWindow.onCancel(new MessageSend(this.getModelObject(), "buscar"));
			oWindow.open();
			
		}
		
	}
		
	/*
	 * oWindow: Ventana a modificar
	 * operacion: operación para la cual se debe preparar. Opciones:
	 * 		C: Compra OK
	 * 		R: Reserva OK
	 */
	private void configurarVentana(ResultadoOperacionWindow oWindow, char operacion){
		switch(operacion){
			case 'C':
				oWindow.setTaskDescription("El asiento " + this.getModelObject().getAsientoSeleccionado().getNumeroAsiento() + " ha sido comprado exitosamente");
				oWindow.onAccept(new MessageSend(this.getModelObject(), "buscar"));
				break;
			case 'R':
				oWindow.setTaskDescription("El asiento " + this.getModelObject().getAsientoSeleccionado().getNumeroAsiento() + " ha sido reservado exitosamente");
				oWindow.onAccept(new MessageSend(this.getModelObject(), "buscar"));
				break;				
		}
	}

}
